#pragma once

// C Headers
extern "C" {
#include <arpa/inet.h>
#include <errno.h>
#include <execinfo.h>
#include <fcntl.h>
#include <inttypes.h>
#include <math.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/un.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>
//
#include <readline/history.h>
#include <readline/readline.h>
}

// C++ Headers
#include <cmath>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
//
#include <Eigen>

#define __UNUSED(arg) (void)arg;

// 定义日志等级
typedef enum
{
	LOGLEVEL_DEBUG = 0, // 调试信息
	LOGLEVEL_INFO,		// 通知信息
	LOGLEVEL_WARING,	// 警告
	LOGLEVEL_ERROR,		// 错误
	LOGLEVEL_CRITIAL,	// 致命
} LOG_LEVEL_E;

extern void LoggerText(int log_level, const char* fmt, ...);

#define LOGD(fmt, ...)		   LoggerText(LOGLEVEL_DEBUG, fmt, ##__VA_ARGS__)
#define LOGI(fmt, ...)		   LoggerText(LOGLEVEL_INFO, fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...)		   LoggerText(LOGLEVEL_WARING, fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...)		   LoggerText(LOGLEVEL_ERROR, fmt, ##__VA_ARGS__)
#define LOGC(fmt, ...)		   LoggerText(LOGLEVEL_CRITIAL, fmt, ##__VA_ARGS__)

#define SOCK_BUFF_SIZE		   (1 * 1024 * 1024)

// TCP端口-普通指令
#define FC_TCP_PORT			   23001
// TCP端口-显示日志
#define FC_TCP_PORT_TEXTLOG	   23002
// UDP端口-数据
#define FC_UDP_PORT_RECV_FDATA 23003

#define RC_TCP_PORT			   24001
#define RC_TCP_PORT_TEXTLOG	   24002